/**
 * 
 */
package compilador.analizadorSintactico.categoriasSintacticas;

import java.util.ArrayList;

import javax.swing.tree.DefaultMutableTreeNode;

import compilador.analizadorSemantico.tablaSimbolos.TablaSimboloSemantico;
import compilador.interfaces.Sentencia;

/**
 * @author Nolberto Castellanos Rodriguez
 * @author Yurani Alejandra Salamanca Lotero
 *
 * Clase que representa la sentencia si
 */
public class SentenciaSi implements Sentencia {

//	-------------------------------------------------------------------------------------------------
//	ATRIBUTOS
//	-------------------------------------------------------------------------------------------------
	
	/**
	 * Atributo que contiene el condicional de la sentencia if
	 */
	private Condicional condicional;

	/**
	 * Atributo que contiene el cuerpo si
	 */
	private CuerpoSi cuerpoSi;
	
	/**
	 * Atributo que contiene los otherwiseif
	 */
	private Otherwisesif otherwisesif;
	
	/**
	 * Atributo que contiene el otherwise
	 */
	private Otherwise otherwise;
	
	
//	-------------------------------------------------------------------------------------------------
//	CONSTRUCTOR
//	-------------------------------------------------------------------------------------------------

	/**
	 * Constructor que permite crear una nueva sentencia si
	 * @param condicional
	 * @param cuerpoSi
	 * @param otherwisesif
	 * @param otherwise
	 */
	public SentenciaSi(Condicional condicional, CuerpoSi cuerpoSi,
			Otherwisesif otherwisesif, Otherwise otherwise) {
		super();
		this.condicional = condicional;
		this.cuerpoSi = cuerpoSi;
		this.otherwisesif = otherwisesif;
		this.otherwise = otherwise;
	}
	
//	-------------------------------------------------------------------------------------------------
//	METODOS
//	-------------------------------------------------------------------------------------------------	

	/* (non-Javadoc)
	 * @see co.edu.uniquindio.ingesis.analizadorSemantico.interfaces.Sentencia#getJavaCode()
	 */
	@Override
	public String getJavaCode() {
		String retornable = "";
		
		if(condicional != null)
			retornable += condicional.getCondicional().getLexema();
		
		if(cuerpoSi != null)
			retornable += cuerpoSi.getJavaCode();
		
		if(otherwisesif != null)
			retornable += otherwisesif.getJavaCode();
		
		if(otherwise != null)
			retornable += otherwise.getJavaCode();
		
		return retornable;
	}
	
	/**
	 * Metodo que permite agregar hojas al nodo de la clase
	 * @return el nodo de la clase con sus hojas
	 */
	public DefaultMutableTreeNode getArbolVisual(){
		DefaultMutableTreeNode miRaiz =  new  DefaultMutableTreeNode("Sentencia si");
		
		if(condicional != null)
			miRaiz.add(condicional.getArbolVisual());
		
		if (cuerpoSi != null)
			miRaiz.add(cuerpoSi.getArbolVisual());
		
		if (otherwisesif != null)
			miRaiz.add(otherwisesif.getArbolVisual());
			
		if (otherwise != null) 
			miRaiz.add(otherwise.getArbolVisual());
		
		return miRaiz;
	}
	
	/* (non-Javadoc)
	 * @see compilador.interfaces.Sentencia#AnalizarSemantica(compilador.analizadorSemantico.tablaSimbolos.TablaSimboloSemantico, java.util.ArrayList, java.lang.String, java.lang.String)
	 */
	@Override
	public void AnalizarSemantica(TablaSimboloSemantico ts, ArrayList<SimboloError> errores, String claseActual, String metodoActual) {
		this.cuerpoSi.analizarSemantica(ts, errores, claseActual, metodoActual);
		this.otherwisesif.analizarSemantica(ts, errores, claseActual, metodoActual);
		this.otherwise.analizarSemantica(ts, errores, claseActual, metodoActual);
	}

//	-------------------------------------------------------------------------------------------------
//	Getters & Setters
//	-------------------------------------------------------------------------------------------------
	
	/**
	 * Metodo que nos retorna el valor de condicional
	 * @return  condicional. Valor retornado
	 */
	public Condicional getCondicional() {
		return condicional;
	}

	/**
	 * Metodo que permite asignar el valor de condicional
	 * @param condicional. Valor a asignar condicional
	 */
	public void setCondicional(Condicional condicional) {
		this.condicional = condicional;
	}

	/**
	 * Metodo que nos retorna el valor de cuerpoSi
	 * @return  cuerpoSi. Valor retornado
	 */
	public CuerpoSi getCuerpoSi() {
		return cuerpoSi;
	}

	/**
	 * Metodo que permite asignar el valor de cuerpoSi
	 * @param cuerpoSi. Valor a asignar cuerpoSi
	 */
	public void setCuerpoSi(CuerpoSi cuerpoSi) {
		this.cuerpoSi = cuerpoSi;
	}

	/**
	 * Metodo que nos retorna el valor de otherwisesif
	 * @return  otherwisesif. Valor retornado
	 */
	public Otherwisesif getOtherwisesif() {
		return otherwisesif;
	}

	/**
	 * Metodo que permite asignar el valor de otherwisesif
	 * @param otherwisesif. Valor a asignar otherwisesif
	 */
	public void setOtherwisesif(Otherwisesif otherwisesif) {
		this.otherwisesif = otherwisesif;
	}

	/**
	 * Metodo que nos retorna el valor de otherwise
	 * @return  otherwise. Valor retornado
	 */
	public Otherwise getOtherwise() {
		return otherwise;
	}

	/**
	 * Metodo que permite asignar el valor de otherwise
	 * @param otherwise. Valor a asignar otherwise
	 */
	public void setOtherwise(Otherwise otherwise) {
		this.otherwise = otherwise;
	}

}